OpenCL in COP
vs. Wrangle
Wrangle(=VEX)は並列計算に最適化されているが、GPUで動くわけではない
このノード(OpenCL)はWrangle COPよりも使いにくいですが、COPではすべての計算をGPU上で実行することが非常に重要なため、VEXの使用よりも推奨されます。
OpenCLはPingPongBufferが即座に用意できる
Solverのような小難しいことは必要ない…
WrangleだとSolver的なものができない
code:OpenCL
@WRITEBACK
{
@src.set(@dst);
}
入出力チャンネルは両者とも変えられるが、Wrangleのほうは、InputとOutputが統一されてしまう問題がある
OpenCLの文法は覚える必要があるが、COPにおいてはWrangleを使うメリットはなく、OpenCLを使うべき
多次元ベクトルなどの演算などもできる
Houdini固有の関数はない代わりにGPU計算に特化した関数群が用意されている
文法
バインドの修飾
& : write
? : opt
! : noread
以下は同じような意味
code:OpenCL
#bind layer src float
#bind layer dst noread write float
code:OpenCL
#bind layer src? val=0
#bind layer !&dst
src? val = 0 はsrcは入力だが、必須ではなく、デフォルト値は0になる、という意味
!&dst は dst noread write と同じ
局所変数には、代入演算子 = で代入できるが、データ構造(@Pなど@によるバインドはインデックスがあるなど普通の変数とは異なる)はset()で安全(内部チェックが実装されている)に代入する必要がある
code:OpenCL
@dst.set((float)(alive));
@Timeや@TimeIncを使う場合は、ノード内の項目にチェックを入れる
GLSLと似たような基本的な関数群が存在する🙌
clamp(), min(), max(), step(), mix(), smoothstep()
Common functions
Math functions
初期化代入は、リテラルをカッコでくくりタイプ変換するというのが慣例
code:OpenCL
float2 center = (float2)(0.5, 0.5);
リテラルの型が謎だから関数の引数もこのような書き方になる
Sample
シンプルなライティング
code:OpenCL
#bind layer src? float3
#bind layer !&dst float3
@KERNEL
{
float3 n = @src;
float3 l = normalize((float3)(0.5, 2, 1));
float c = dot(n, l);
@dst.set(c);
}
Ref
https://www.sidefx.com/ja/docs/houdini/vex/ocl.html
https://www.sidefx.com/ja/docs/houdini/nodes/cop/opencl.html
#Houdini #COPernicus